/** 
 * 某地刑侦大队对涉及六个嫌疑人的一桩疑案进行分析： <br> 
 * A、B至少有一人作案；<br> 
 * A、E、F三人中至少有两人参与作案；<br> 
 * A、D不可能是同案犯；<br> 
 * B、C或同时作案，或与本案无关； C、D中有且仅有一人作案；<br> 
 * 如果D没有参与作案，则E也不可能参与作案。<br> 
 * 试编一程序，将作案人找出来。 
 *  
 */ 
package charles.testproject.findcriminal;

import charles.testproject.test.Test;

public class FindCriminal {
	
	public static void main(String[] args){
		String[] persons = { "A", "B", "C", "D", "E", "F" }; 
	    for (int i = 0; i <= 63; i++) { 
	     int t = i;
	     int j = 5;
	     int[] num = new int[6];
	     for(;j >= 0; j--) {
	    	 if(t / 2 > 0) {
	    		 num[j] = t%2;
	    		 t = t/2;
	    	 }
	    	 else {
	    		 num[j] = t;
	    		 break;
	    	 }
	     }
		/**
		 * 这里的打印证明了上面的程序可以用一个数组表示一个有六位的二进制数
		 * 这个二进制数从00000~111111，每一个位上的0和1分别代表没有犯罪以及
		 * 犯罪。这样穷尽了A~F六个人所有犯罪的情况。
		 */
	     for(int k=0; k<6; k++) {
	    	 System.out.print(num[k]);
	     }
	     System.out.println();
	     /**
		  * 下面就是根据逻辑推度的条件来推出A~F到底几人犯罪，哪几人犯罪。
		  * num[0] ~ num[5] 分别代表 A ~ F
		  */
		 if(num[0] + num[1] >= 1){  //A、B至少有一人作案
	    	if(num[0] + num[4] + num[5] >=2) {   //A、E、F三人中至少有两人参与作案
	    		if(num[0] + num[3] <=1) {  //A、D不可能是同案犯
	    			if((num[1] + num[2] == 2||num[1] + num[2] == 0) && num[2]+num[3] ==1 ) {  //B、C或同时作案，或与本案无关； C、D中有且仅有一人作案
	    				if(num[3] ==0 && num[4] == 0 || num[3] == 1) { //如果D没有参与作案，则E也不可能参与作案
	    					for(int index = 0; index < num.length; index++) {
	    						if(num[index] == 1) {
	    							System.out.println(persons[index]);
	    						}
	    					}
	    				}
	    			}
	    		}
	    	}
	     } 
	   }
	}
}
/**
 * 从这个程序中学会了表示2进制的方法，同样的道理，到时候再做其他进制的题目就可以参考了
 */
